package river_city_ransom.services;

import java.util.List;

import exceptions.ComposantError;

public interface Terrain {
	/** _________________________________________________________ OBSERVATORS */
	public Dimensions dimensions();
	public List<Bloc> blocs();
	public Bloc bloc(Position p) throws ComposantError;
	public List<Objet> objets();
	
	/** __________________________________________________________ INVARIANTS */
//	inv bloc(T, p) = { b si ∃b ∈ blocs(T), Bloc::position(b) = p
//					 { NULL sinon
	
	/** ________________________________________________________ CONSTRUCTORS */
//	pre init(d, l, lo) require d != NULL ^ b != Ø ^ lo != Ø
//    post dimensions(init(d, b, lo)) = d
//	post blocs(init(d, b, lo)) = b
//	post objets(init(d, b, lo)) = lo
	public void init(Dimensions d, List<Bloc> b, List<Objet> lo) throws ComposantError;
	
	/** ___________________________________________________________ OPERATORS */
//	pre setBloc(T, bloc) require bloc != NULL ^ bloc(T, Bloc::position(bloc)) = NULL
//	post blocs(setBloc(T, b)) = blocs(T) U {b}
//	post objets(setBloc(T, b)) = objets(T)
	public void setBloc(Bloc bloc) throws ComposantError;
	
	//TODO: changer le appartient
//	pre delBloc(T, bloc) require bloc != NULL ^ bloc appartient blocs(T)
//	post blocs(delBloc(T, b)) = blocs(T) \ {b}
//	post objets(delBloc(T, b)) = objets(T)
	public void delBloc(Bloc bloc)throws ComposantError;
	
//	pre addObjet(T, o) require o != NULL
//	post objets(addObjet(T, o)) = objets(T) \ o
//	post blocs(addObjet(T, o)) = blocs(T)
	public void addObjet(Objet o)throws ComposantError;
	
//	pre delObjet(T, o) require o != NULL ^ o appartient objets(T)
//	post objets(addObjet(T, o)) = objets(T) \ o
//	post blocs(addObjet(T, o)) = blocs(T)
	public void delObjet(Objet o)throws ComposantError;
}
